একটি Recursive Function হল এমন একটি ফাংশন যা নিজেই নিজেকে কল করে। এটি সাধারণত তখন ব্যবহৃত হয়, যখন একটি সমস্যা ছোট অংশে বিভক্ত করে সমাধান করা যায় এবং প্রতিটি অংশের সমাধান একে অপরের উপর নির্ভর করে।
PL/SQL-এ recursive function তৈরি করার সময় এটি খুবই গুরুত্বপূর্ণ যে একটি base case (বেস কেস) বা terminating condition থাকা উচিত, যা নিশ্চিত করবে যে রিকার্সন সীমিত থাকবে এবং ইনফিনিট লুপ তৈরি করবে না।
Recursive Function এর গঠন:
একটি recursive function দুটি অংশে বিভক্ত:
- Base Case (Termination Condition): যখন রিকার্সন থামবে, অর্থাৎ যখন ফাংশন নিজেকে কল করতে থাকবে না।
- Recursive Case: যেখানে ফাংশন নিজেকে আবার কল করবে, যাতে সমস্যা ছোট ছোট অংশে বিভক্ত হতে পারে।
সিনট্যাক্স:
FUNCTION function_name (parameter) RETURN datatype IS
BEGIN
-- Base case
IF (condition) THEN
RETURN value;
ELSE
-- Recursive call
RETURN function_name(parameter);
END IF;
END;
উদাহরণ ১: ফ্যাক্টোরিয়াল (Factorial) গণনা করা
ফ্যাক্টোরিয়াল একটি ক্লাসিক উদাহরণ যেখানে রিকার্সন ব্যবহৃত হয়। একটি সংখ্যা n এর ফ্যাক্টোরিয়াল হল n * (n-1) * (n-2) * ... * 1। এই ফাংশনটি নিজেকে কল করে ছোট ছোট অংশে বিভক্ত হবে, যতক্ষণ না বেস কেস (যেমন n = 1) পৌঁছায়।
ফ্যাক্টোরিয়াল রিকার্সিভ ফাংশন:
CREATE OR REPLACE FUNCTION factorial(n IN NUMBER) RETURN NUMBER IS
BEGIN
-- Base Case: If n is 1, return 1
IF n = 1 THEN
RETURN 1;
ELSE
-- Recursive Case: n * factorial(n-1)
RETURN n * factorial(n-1);
END IF;
END;
ব্যবহার:
DECLARE
v_result NUMBER;
BEGIN
v_result := factorial(5); -- Calling the recursive function
DBMS_OUTPUT.PUT_LINE('Factorial of 5 is: ' || v_result);
END;
Output:
Factorial of 5 is: 120
এখানে, factorial(5) প্রথমে 5 * factorial(4) কল করে, এরপর factorial(4) কল হয় 4 * factorial(3) কল করার জন্য, এবং এইভাবে এটি চলতে থাকে যতক্ষণ না n = 1 (বেস কেস) হয়, যেখানে এটি থেমে গিয়ে 1 ফেরত দেয়।
উদাহরণ ২: Fibonacci সিরিজ
ফিবোনাচ্চি সিরিজ একটি জনপ্রিয় গাণিতিক সিরিজ যেখানে প্রতিটি সংখ্যা আগের দুইটি সংখ্যার যোগফল। উদাহরণস্বরূপ: 0, 1, 1, 2, 3, 5, 8, 13, ...
ফিবোনাচ্চি সিরিজ গণনার জন্য একটি recursive function ব্যবহার করা যেতে পারে।
ফিবোনাচ্চি সিরিজ রিকার্সিভ ফাংশন:
CREATE OR REPLACE FUNCTION fibonacci(n IN NUMBER) RETURN NUMBER IS
BEGIN
-- Base Case: Fibonacci(0) = 0, Fibonacci(1) = 1
IF n = 0 THEN
RETURN 0;
ELSIF n = 1 THEN
RETURN 1;
ELSE
-- Recursive Case: Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)
RETURN fibonacci(n-1) + fibonacci(n-2);
END IF;
END;
ব্যবহার:
DECLARE
v_result NUMBER;
BEGIN
v_result := fibonacci(6); -- Calling the recursive function
DBMS_OUTPUT.PUT_LINE('Fibonacci number at position 6 is: ' || v_result);
END;
Output:
Fibonacci number at position 6 is: 8
এখানে, fibonacci(6) কল করলে এটি প্রথমে fibonacci(5) + fibonacci(4) হিসাব করবে, এবং এইভাবে ছোট ছোট সাব-সমস্যাগুলোর সমাধান করবে।
Recursive Functions এর সুবিধা ও সমস্যা:
সুবিধা:
- সহজ সমস্যা সমাধান: কিছু সমস্যা যেমন ফ্যাক্টোরিয়াল, ফিবোনাচ্চি, ট্রী traversal ইত্যাদি সহজেই রিকার্সন দিয়ে সমাধান করা যায়।
- কম কোড: অনেক ক্ষেত্রে, রিকার্সিভ ফাংশন সাধারণত কম কোডে সমস্যার সমাধান করতে সক্ষম।
- অবজেক্ট-মডেল প্রোগ্রামিং: রিকার্সন অবজেক্ট বা ডেটা স্ট্রাকচার ভিত্তিক সমস্যা সমাধানে কার্যকর হতে পারে (যেমন ট্রী, গ্রাফ ইত্যাদি)।
সমস্যা:
- স্ট্যাক ওভারফ্লো: যদি রিকার্সন খুব গভীর হয়, তাহলে স্ট্যাক ওভারফ্লো হতে পারে। এই কারণে ফাংশনটি অধিক রিকার্সন সীমিত হতে হবে।
- পারফরম্যান্স: রিকার্সিভ ফাংশনগুলো অনেক সময় অকার্যকর হতে পারে, কারণ অনেক সাব-ফাংশন কল হয় এবং এগুলো পুনরাবৃত্তি হতে পারে (যেমন ফিবোনাচ্চি সিরিজে একাধিক বার একই মান হিসাব করা হয়)।
- মেমরি খরচ: রিকার্সন গভীর হতে থাকলে মেমরি ব্যবহার অনেক বেশি হতে পারে।
Recursive Function এ Optimization:
- Memoization: একে অপরকে পুনরাবৃত্তি না করার জন্য ফলাফলগুলো মেমোরিতে সংরক্ষণ করা যায় (যেমন ফিবোনাচ্চি সিরিজে একটি বার হিসাব করা মান পুনরায় ব্যবহার করা)।
- Tail Recursion: PL/SQL সাধারণত tail recursion সমর্থন করে না, কিন্তু আপনি tail recursion স্টাইল ব্যবহার করার মাধ্যমে রিকার্সন সমস্যার কিছুটা সমাধান পেতে পারেন।
সারাংশ:
- Recursive Function হলো এমন একটি ফাংশন যা নিজেকে কল করে এবং এটি সাধারণত একটি সমস্যাকে ছোট ছোট অংশে বিভক্ত করার জন্য ব্যবহার করা হয়।
- Base Case এবং Recursive Case এর মাধ্যমে একটি ফাংশন নিজেকে কল করে এবং একে অপরের উপর নির্ভরশীল সমস্যাগুলোর সমাধান করে।
- ফ্যাক্টোরিয়াল এবং ফিবোনাচ্চি সিরিজের মতো সমস্যা সমাধান করার জন্য রিকার্সন খুবই কার্যকর, তবে এটি কখনও কখনও পারফরম্যান্স ও মেমরি সমস্যার সৃষ্টি করতে পারে।
Read more